package com.monitor.ui.controller;

import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.scene.Node;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

import java.io.IOException;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import java.util.ResourceBundle;

/**
 * 主界面控制器，处理主界面的交互逻辑和页面切换
 */
public class MainFrameController implements Initializable {

    @FXML
    private Button homeBtn;

    @FXML
    private Button protectionBtn;

    @FXML
    private Button controlBtn;

    @FXML
    private Button resourceBtn;

    @FXML
    private Button maintenanceBtn;

    @FXML
    private StackPane contentArea;

    @FXML
    private Label statusLabel;

    // 存储已加载的内容面板
    private final Map<String, Node> loadedPanels = new HashMap<>();

    @Override
    public void initialize(URL location, ResourceBundle resources) {
        // 默认选中首页
        selectTab("home");
    }

    /**
     * 处理首页按钮点击事件
     * @param event 事件对象
     */
    @FXML
    private void onHomeClicked(ActionEvent event) {
        selectTab("home");
    }

    /**
     * 处理防护中心按钮点击事件
     * @param event 事件对象
     */
    @FXML
    private void onProtectionClicked(ActionEvent event) {
        selectTab("protection");
    }

    /**
     * 处理控制中心按钮点击事件
     * @param event 事件对象
     */
    @FXML
    private void onControlClicked(ActionEvent event) {
        selectTab("control");
    }

    /**
     * 处理资源中心按钮点击事件
     * @param event 事件对象
     */
    @FXML
    private void onResourceClicked(ActionEvent event) {
        selectTab("resource");
    }

    /**
     * 处理维护中心按钮点击事件
     * @param event 事件对象
     */
    @FXML
    private void onMaintenanceClicked(ActionEvent event) {
        selectTab("maintenance");
    }

    /**
     * 处理帮助按钮点击事件
     * @param event 事件对象
     */
    @FXML
    private void onHelpClicked(ActionEvent event) {
        // 显示帮助对话框
        showAlert("帮助", "系统帮助信息", "这里是系统帮助内容，可以提供使用指南和常见问题解答。");
    }

    /**
     * 处理设置按钮点击事件
     * @param event 事件对象
     */
    @FXML
    private void onSettingsClicked(ActionEvent event) {
        // 显示设置对话框
        showAlert("设置", "系统设置", "这里可以进行系统设置和配置。");
    }

    /**
     * 处理最小化按钮点击事件
     * @param event 事件对象
     */
    @FXML
    private void onMinimizeClicked(ActionEvent event) {
        Stage stage = (Stage) ((Node) event.getSource()).getScene().getWindow();
        stage.setIconified(true);
    }

    /**
     * 处理关闭按钮点击事件
     * @param event 事件对象
     */
    @FXML
    private void onCloseClicked(ActionEvent event) {
        try {
            // 返回到首页
            FXMLLoader loader = new FXMLLoader(getClass().getResource("/fxml/DashBoard.fxml"));
            Parent root = loader.load();
            
            Stage stage = (Stage) ((Node) event.getSource()).getScene().getWindow();
            Scene scene = new Scene(root, 800, 600);
            scene.getStylesheets().add(getClass().getResource("/css/style.css").toExternalForm());
            
            stage.setScene(scene);
        } catch (IOException e) {
            e.printStackTrace();
            // 如果加载失败，直接关闭窗口
            Stage stage = (Stage) ((Node) event.getSource()).getScene().getWindow();
            stage.close();
        }
    }

    /**
     * 选择指定的选项卡
     * @param tabName 选项卡名称
     */
    public void selectTab(String tabName) {
        // 重置所有按钮样式
        resetButtonStyles();
        
        // 设置选中按钮样式
        switch (tabName) {
            case "home":
                homeBtn.getStyleClass().add("nav-button-selected");
                loadPanel("/fxml/panels/HomePanel.fxml", "home");
                break;
            case "protection":
                protectionBtn.getStyleClass().add("nav-button-selected");
                loadPanel("/fxml/panels/ProtectionPanel.fxml", "protection");
                break;
            case "control":
                controlBtn.getStyleClass().add("nav-button-selected");
                loadPanel("/fxml/panels/ControlPanel.fxml", "control");
                break;
            case "resource":
                resourceBtn.getStyleClass().add("nav-button-selected");
                loadPanel("/fxml/panels/ResourcePanel.fxml", "resource");
                break;
            case "maintenance":
                maintenanceBtn.getStyleClass().add("nav-button-selected");
                loadPanel("/fxml/panels/MaintenancePanel.fxml", "maintenance");
                break;
        }
        
        // 更新状态栏
        updateStatusBar(tabName);
    }

    /**
     * 重置所有导航按钮的样式
     */
    private void resetButtonStyles() {
        homeBtn.getStyleClass().remove("nav-button-selected");
        protectionBtn.getStyleClass().remove("nav-button-selected");
        controlBtn.getStyleClass().remove("nav-button-selected");
        resourceBtn.getStyleClass().remove("nav-button-selected");
        maintenanceBtn.getStyleClass().remove("nav-button-selected");
    }

    /**
     * 加载指定的面板
     * @param fxmlPath FXML文件路径
     * @param panelName 面板名称
     */
    private void loadPanel(String fxmlPath, String panelName) {
        try {
            // 清空内容区域
            contentArea.getChildren().clear();
            
            // 检查是否已加载过该面板
            if (loadedPanels.containsKey(panelName)) {
                // 如果已加载，直接显示
                contentArea.getChildren().add(loadedPanels.get(panelName));
            } else {
                // 如果未加载，加载FXML
                try {
                    Parent panel = FXMLLoader.load(getClass().getResource(fxmlPath));
                    loadedPanels.put(panelName, panel);
                    contentArea.getChildren().add(panel);
                } catch (IOException e) {
                    // 如果加载失败，显示错误信息
                    showErrorPanel("加载面板失败: " + e.getMessage());
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
            showErrorPanel("显示面板失败: " + e.getMessage());
        }
    }

    /**
     * 显示错误面板
     * @param errorMessage 错误信息
     */
    private void showErrorPanel(String errorMessage) {
        // 创建错误面板
        javafx.scene.layout.VBox errorPanel = new javafx.scene.layout.VBox(10);
        errorPanel.setAlignment(javafx.geometry.Pos.CENTER);
        errorPanel.setPadding(new javafx.geometry.Insets(20));
        
        javafx.scene.control.Label errorLabel = new javafx.scene.control.Label("错误");
        errorLabel.setStyle("-fx-font-size: 18px; -fx-font-weight: bold; -fx-text-fill: red;");
        
        javafx.scene.control.Label messageLabel = new javafx.scene.control.Label(errorMessage);
        messageLabel.setWrapText(true);
        messageLabel.setStyle("-fx-font-size: 14px;");
        
        errorPanel.getChildren().addAll(errorLabel, messageLabel);
        
        // 显示错误面板
        contentArea.getChildren().clear();
        contentArea.getChildren().add(errorPanel);
    }

    /**
     * 更新状态栏信息
     * @param tabName 当前选项卡名称
     */
    private void updateStatusBar(String tabName) {
        switch (tabName) {
            case "home":
                statusLabel.setText("首页 - 系统概览");
                break;
            case "protection":
                statusLabel.setText("防护中心 - 保护上网环境安全");
                break;
            case "control":
                statusLabel.setText("控制中心 - 限制控制设备使用时间");
                break;
            case "resource":
                statusLabel.setText("资源中心 - 收藏各种教育资源信息");
                break;
            case "maintenance":
                statusLabel.setText("维护中心 - 监管更新系统环境");
                break;
            default:
                statusLabel.setText("系统正常运行中");
        }
    }

    /**
     * 显示警告对话框
     * @param title 标题
     * @param header 头信息
     * @param content 内容
     */
    private void showAlert(String title, String header, String content) {
        javafx.scene.control.Alert alert = new javafx.scene.control.Alert(javafx.scene.control.Alert.AlertType.INFORMATION);
        alert.setTitle(title);
        alert.setHeaderText(header);
        alert.setContentText(content);
        alert.showAndWait();
    }
}